
/**
 *  \file vcp.h
 *
 *  \brief This file defines the Volume Control Profile Interface - includes
 *  Data Structures and Methods.
 */

/*
 *  Copyright (C) 2020. Mindtree Ltd.
 *  All rights reserved.
 */

#ifndef _H_VCP_
#define _H_VCP_


/* --------------------------------------------- Header File Inclusion */
#include "EM_os.h"
#include "GA_api.h"

/* --------------------------------------------- Global Definitions */

/* TODO: Move this to internal? */
#define VCP_CONTEXT_INVALID               0xFF

#define VCP_CONTEXT_SVC_INVALID           0xFF

/* --------------------------------------------- Data types /Structures */

/** VCP Callback to be regiserd by the Aplication */
typedef GA_RESULT (* GA_VCP_CB)
                  (
                      /* IN */ GA_ENDPOINT * device,
                      /* IN */ UINT8 event_type,
                      /* IN */ UINT16 event_status,
                      /* IN */ void * event_data,
                      /* IN */ UINT16 event_datalen
                  );


/* TODO: Move these Context structure to internal? */
/**
 * VCP VCS Contexts
 */
typedef struct _VCP_VCS_CONTEXTS_
{
    /**
     * Status Flag
     */
    UCHAR status;

    /* Device Endpoint */
    GA_ENDPOINT device;

    /**
     * Volume State
     */
    UINT16 char_VOLUME_STATE;

    /**
     * Volume Control Point
     */
    UINT16 char_VOLUME_CP;

    /**
     * Volume Flags
     */
    UINT16 char_VOLUME_FLAGS;

   /**
    * Status Flag
    */
    UCHAR cntx_id;

    /* Context Event for a procedure */
    UINT8 cntx_event;
}VCP_VCS_CONTEXTS;

typedef struct _VCP_VOCS_CONTEXTS_
{
    /**
     * Status Flag
     */
    UCHAR status;

    /**
     * VCS Service Handle
     */
    UCHAR vcs_hndl;

    /**
     * Offset State
     */
    UINT16 char_OFFSET_STATE;

    /**
     * Audio Location
     */
    UINT16 char_AUDIO_LOCATION;

    /**
     * Volume Offset Control Point
     */
    UINT16 char_VOLUME_OFFSET_CP;

    /**
     * Audio Output Description
     */
    UINT16 char_AUDIO_OUTPUT_DESCRIPTION;

   /**
    * Status Flag
    */
    UCHAR cntx_id;


    /* Context Event for a procedure */
    UINT8 cntx_event;

}VCP_VOCS_CONTEXTS;

typedef struct _VCP_AICS_CONTEXTS_
{
    /**
    * Status Flag
    */
    UCHAR status;

    /**
     * VCS Service Handle
     */
    UCHAR vcs_hndl;

    /**
     * Input State
     */
    UINT16 char_INPUT_STATE;

    /**
     * Gain Setting Properties
     */
    UINT16 char_GAIN_SETTING_PROPERTIES;

    /**
     * Input Type
     */
    UINT16 char_INPUT_TYPE;

    /**
     * Input Status
     */
    UINT16 char_INPUT_STATUS;

    /**
     * Audio Input Control Point
     */
    UINT16 char_AUDIO_INPUT_CP;

    /**
     * Audio Input Description
     */
    UINT16 char_AUDIO_INPUT_DESCRIPTION;

   /**
    * Status Flag
    */
    UCHAR cntx_id;

    /* Context Event for a procedure */
    UINT8 cntx_event;
}VCP_AICS_CONTEXTS;


/**
 * Volume Control Service Volume State Characteristic Fields.
 */
typedef struct _VCS_CHAR_VOL_STATE_PARAMS
{
    /**
     * Volume Setting
     * Range: 0 - 255
     */
    UCHAR volume_setting;

    /**
     * Mute
     *  0 -> UnMute
     *  1 -> Mute
     */
    UCHAR mute;

    /**
     * Change Counter
     * Range: 0 - 255
     */
    UCHAR change_counter;
}VCS_CHAR_VOL_STATE_PARAMS;

/**
 * Volume Control Service Characteristics Info.
 */
typedef struct _VCS_CHAR_INFO
{
    /**
     * Volume State
     */
    VCS_CHAR_VOL_STATE_PARAMS    *vol_state;

    /**
     * Volume Flags
     */
    UCHAR volume_flags;
}VCS_CHAR_INFO;

/* ===== VOCS ==== */
/**
 * VOCS: Offset State Characteristic Fields.
 */
typedef struct _VOCS_CHAR_OFFSET_STATE_PARAMS
{
    /**
     * Volume Offset
     */
     UINT16 vol_offset;

    /**
     * Change Counter
     * Range: 0 - 255
     */
    UCHAR change_counter;
}VOCS_CHAR_OFFSET_STATE_PARAMS;

/**
 * Volume Offset Control Service Characteristics Info.
 */
typedef struct _VOCS_CHAR_INFO
{
    /**
     * Offset State
     */
    VOCS_CHAR_OFFSET_STATE_PARAMS *offset_state;

    /**
     * Audio Location
     * TODO: this is Assign number relook the data type.
     */
    UINT16  audio_loc;

    /**
     * Audio Output Description
     * TODO: Make as Pointer?
     */
    UCHAR   audio_out_desc[GA_MAX_VOCS_CHAR_AUDIO_OUTPUT_DESC_LEN];

    /**
     * Audio Output Description Length
     */
    UCHAR   audio_out_desc_len;

}VOCS_CHAR_INFO;

/* ===== AICS ==== */
/**
 * AICS: Input State Characteristic Fields.
 */
typedef struct _AICS_CHAR_INPUT_STATE_PARAMS
{
    /**
     * Gain Setting
     */
     CHAR gain_setting;

    /**
     * Mute
     */
    UCHAR  mute;

    /**
     * Gain Mode
     */
    UCHAR gain_mode;

    /**
     * Change Counter
     * Range: 0 - 255
     */
    UCHAR change_counter;
}AICS_CHAR_INPUT_STATE_PARAMS;

/**
 * AICS: Gain Setting Characteristic Fields.
 */
typedef struct _AICS_CHAR_GAIN_SETTING_PARAMS
{
    /**
     * Gain Setting Units
     */
    UCHAR   gain_setting_units;

    /**
     * Gain Setting Minimum
     */
    CHAR    gain_settting_min;

    /**
     * Gain Setting Maximum
     */
    CHAR    gain_setting_max;
}AICS_CHAR_GAIN_SETTING_PARAMS;

/**
 * Audio Input Control Service Characteristics Info.
 */
typedef struct _AICS_CHAR_INFO
{
    /**
     * Input State
     */
    AICS_CHAR_INPUT_STATE_PARAMS  *input_state;

    /**
     * Gain Setting Properties
     */
    AICS_CHAR_GAIN_SETTING_PARAMS    *gain_setting;

    /**
     * Input Type
     * TODO: this Assign number relook the type.
     */
    UCHAR   input_type;

    /**
     * Input Status
     */
    UCHAR   input_status;

    /**
     * Audio Input Description
     * TODO: Make as Pointer?
     */
    UCHAR   audio_in_desc[GA_MAX_AICS_CHAR_AUDIO_INPUT_DESC_LEN];

    /**
     * Audio Input Description Leng
     */
    UCHAR   audio_in_desc_len;
}AICS_CHAR_INFO;

/* --------------------------------------------- Macros */

/* VCP Service UUIDs */
#define VCP_SVC_UUID_VCS                            0x183E /* 0x8FD1 */
#define VCP_SVC_UUID_VOCS                           0x8FD2
#define VCP_SVC_UUID_AICS                           0x8FD3

/* VCS Charactetrics UUID Defines */
#define VCS_CHR_UUID_VOLUME_STATE                   0x2B3A /* 0x8FB9 */
#define VCS_CHR_UUID_VOLUME_CP                      0x2B3B /* 0x8FBA */
#define VCS_CHR_UUID_VOLUME_FLAG                    0x2B3C /* 0x8FBB */

/* VOCS Charactetrics UUID Defines */
#define VOCS_CHR_UUID_OFFSET_STATE                  0x8FBC
#define VOCS_CHR_UUID_AUDIO_LOCATION                0x8FBD
#define VOCS_CHR_UUID_OFFSET_CP                     0x8FBE
#define VOCS_CHR_UUID_AUDIO_OUTPUT_DESCRIPTION      0x8FBF

/* AICS Charactetrics UUID Defines */
#define AICS_CHR_UUID_INPUT_STATE                   0x8FE2
#define AICS_CHR_UUID_GAIN_SETTING                  0x8FE3
#define AICS_CHR_UUID_INPUT_TYPE                    0x8FE5
#define AICS_CHR_UUID_INPUT_STATUS                  0x8FE6
#define AICS_CHR_UUID_AUDIO_INPUT_CP                0x8FE7
#define AICS_CHR_UUID_AUDIO_INPUT_DESCRIPTION       0x8FE8

/* VCP Error Code */
#define GA_VCP_INVALID_STATE                            0x2011
#define GA_VCP_INVALID_PARAMS                           0x2012

/* Error OpCodes */
#define VCS_ERR_CODE_INVALID_CHNG_CNTR              0x80
#define VCS_ERR_CODE_OPCODE_NOT_SUPPORTED           0x81

/* Volume State Char.: Volume Setting Field Min/Max Values */
#define VCS_VOLUME_SETTING_MIN                      0x00
#define VCS_VOLUME_SETTING_MAX                      0xFF

/* Volume State Char.: Mute Field values */
#define VCS_MUTE_NO                                 0x00
#define VCS_MUTE_YES                                0x01

/* Volume State Char.: Change Counter Field */
#define VCS_CHNG_CNTR_MIN                           0x00
#define VCS_CHNG_CNTR_MAX                           0xFF

/* Volume Setting Persistance Related */
#define VCS_VOLUME_SETTING_PERSIST_NO               0x00
#define VCS_VOLUME_SETTING_PERSIST_YES              0x01

/**
 * Volume Control Point Opcodes
 */
#define VCS_CP_OP_RELATIVE_VOL_DOWN                 0x00
#define VCS_CP_OP_RELATIVE_VOL_UP                   0x01
#define VCS_CP_OP_UNMUTE_RELATIVE_VOL_DOWN          0x02
#define VCS_CP_OP_UNMUTE_RELATIVE_VOL_UP            0x03
#define VCS_CP_OP_SET_ABSOLUE_VOL                   0x04
#define VCS_CP_OP_UNMUTE                            0x05
#define VCS_CP_OP_MUTE                              0x06

/* VCS Events */
#define VCS_EVENT_CONFIG_VOLUME_STATE_NOTIFY_CNF    0x01
#define VCS_EVENT_GET_VOLUME_STATE_CNF              0x02
#define VCS_EVENT_CONFIG_VOLUME_FLAGS_NOTIFY_CNF    0x03
#define VCS_EVENT_GET_VOLUME_FLAGS_CNF              0x04

/* TODO: Define event per CP_OP write? */
#define VCS_EVENT_CP_WT_CNF                         0x05

/* #define VCS_EVENT_CP_WT_IND                         0x06 */
#define VCS_EVENT_REL_VOL_DOWN_IND                  0x06 
#define VCS_EVENT_REL_VOL_UP_IND                    0x07
#define VCS_EVENT_UNMUTE_REL_VOL_DOWN_IND           0x08
#define VCS_EVENT_UNMUTE_REL_VOL_UP_IND             0x09
#define VCS_EVENT_SET_ABSOLUTE_VOL_IND              0x0A
#define VCS_EVENT_UNMUTE_IND                        0x0B
#define VCS_EVENT_MUTE_IND                          0x0C


/* ====== VOCS ======== */
/* VOCS Related Error Codes */
#define VOCS_ERR_CODE_INVALID_CHNG_CNTR              0x80
#define VOCS_ERR_CODE_OPCODE_NOT_SUPPORTED           0x81
#define VOCS_ERR_CODE_VALUE_OUT_OF_RANGE             0x82

/* Volume Offset Min./Max. */
#define VOCS_VOLUME_OFFSET_MIN                      -255
#define VOCS_VOLUME_OFFSET_MAX                       255

/* Change Counter Min./Max. */
#define VOCS_CHNG_CNTR_MIN                           0x00
#define VOCS_CHNG_CNTR_MAX                           0xFF

/* Control Point Opcodes */
#define VOCS_CP_OP_SET_VOLUME_OFFSET                 0x01

/* VOCS Events */
#define VOCS_EVENT_CONFIG_OFFSET_STATE_NOTIFY_CNF    0x21
#define VOCS_EVENT_GET_OFFSET_STATE_CNF              0x22
#define VOCS_EVENT_CONFIG_AUDIO_LOCATION_NOTIFY_CNF  0x23
#define VOCS_EVENT_GET_AUDIO_LOCATION_CNF            0x24
#define VOCS_EVENT_SET_AUDIO_LOCATION_CNF            0x25
#define VOCS_EVENT_CONFIG_AUDIO_OUT_DESC_NOTIFY_CNF  0x26
#define VOCS_EVENT_GET_AUDIO_OUT_DESC_CNF            0x27
#define VOCS_EVENT_SET_AUDIO_OUT_DESC_CNF            0x28

#define VOCS_EVENT_CP_WT_CNF                         0x29
#define VOCS_EVENT_CP_WT_IND                         0x2A

/* ====== AICS ======== */
/* AICS Related Error Codes */
#define AICS_ERR_CODE_INVALID_CHNG_CNTR              0x80
#define AICS_ERR_CODE_OPCODE_NOT_SUPPORTED           0x81
#define AICS_ERR_CODE_MUTE_DISABLED                  0x82
#define AICS_ERR_CODE_VALUE_OUT_OF_RANGE             0x83
#define AICS_ERR_CODE_GAIN_MODE_CHANG_NOT_ALLOWED    0x84

/* AICS Mute Field Values */
#define AICS_NOT_MUTED                               0x00
#define AICS_MUTED                                   0x01
#define AICS_DISABLED                                0x02

/* AICS Gain Mode Field */
#define AICS_GM_MANUAL_ONLY                          0x00
#define AICS_GM_AUTOMATIC_ONLY                       0x01
#define AICS_GM_MANUAL                               0x02
#define AICS_GM_AUTO                                 0x03

/* Input Status */
#define AICS_IN_STATUS_INACTIVE                      0x00
#define AICS_IN_STATUS_ACTIVE                        0x01

/* AICS Gain Setting Min./Max. */
#define AICS_GAIN_SETTING_MIN                       -128
#define AICS_GAIN_SETTING_MAX                        127

/* Control Point Opcodes */
#define AICS_CP_OP_SET_GAIN_SETTING                  0x01
#define AICS_CP_OP_UNMUTE                            0x02
#define AICS_CP_OP_MUTE                              0x03
#define AICS_CP_OP_SET_MANUAL_GAIN_MODE              0x04
#define AICS_CP_OP_SET_AUTO_GAIN_MODE                0x05

/* AICS Events */
#define AICS_EVENT_CONFIG_INPUT_STATE_NOTIFY_CNF        0x41
#define AICS_EVENT_GET_INPUT_STATE_CNF                  0x42
#define AICS_EVENT_GET_GAIN_SETTING_PROPRTY_CNF         0x43
#define AICS_EVENT_GET_INPUT_TYPE_CNF                   0x44
#define AICS_EVENT_CONFIG_INPUT_STATUS_NOTIFY_CNF       0x45
#define AICS_EVENT_GET_INPUT_STATUS_CNF                 0x46
#define AICS_EVENT_CONFIG_AUDIO_INPUT_DESC_NOTIFY_CNF   0x47
#define AICS_EVENT_GET_AUDIO_INPUT_DESC_CNF             0x48
#define AICS_EVENT_SET_AUDIO_INPUT_DESC_CNF             0x49
#define AICS_EVENT_CP_WT_CNF                            0x4A
#define AICS_EVENT_CP_WT_IND                            0x4B

/* Common Event */
#define  VCP_SETUP_VCS_CNF                              0x61
#define  VCP_DISCVER_VCS_INCLUDE_SRVC_CNF               0x62
#define  VCP_DISCOVER_SRVS_CONTINUE_CNF                 0x63
#define  VCP_DISCOVER_SRVS_CNF                          0x64
#define  VCP_DISCOVER_CHAR_CNF                          0x65
#define  VCP_EVENT_INVALID                              0xFF

/* --------------------------------------------- APIs */
/**
 *  \brief To Init the VCP Module
 *
 *  \par Description:
 *       This function enables to initialize the GA VCP Module;
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_init(void);

/**
 *  \brief To Shutdown the VCP Module
 *
 *  \par Description:
 *       This function enables to Shutdown the GA VCP Module;
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_shutdown(void);

/**
 *  \brief To Register a callback with VCP Module
 *
 *  \par Description:
 *       This function enables to register callback with GA VCP Module;
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_register_cb
          (
              GA_VCP_CB  vcp_cb
          );

/* ============= VCP Controller ============= */
#ifdef GA_VCP_CONTROLLER
/**
 *  \brief To Setup Volume Control Service(VCS) Context
 *
 *  \par Description:
 *       This function enables to setup VCS context with given device.
 *       Internally, VCS service is discovered.
 *
 *  \param [in] device
 *        Peer Device with which the context is setup.
 *
 *  \param [out] vcs_hndl
 *        Allocated VCS Context Handle.
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 *          If API_SUCCESS, VCP_DISCOVER_SRVS_CNF is notified.
 */
GA_RESULT VCP_cntrl_setup_vcs_cntx
          (
              /* IN */ GA_ENDPOINT * device,
              /* OUT */ UINT8 * vcs_hndl
          );

/**
 *  \brief To Setup Volume Offset Control Service Context
 *
 *  \par Description:
 *       This function enables to setup a context with given VCS.
 *
 *  \param [in] vcs_hndl
 *        VCS Handle associated with VOCS
 *
 *  \param [out] vocs_hndl
 *        Allocated VOCS Context Handle.
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 *         If API_SUCCESS, VCP_DISCOVER_SRVS_CONTINUE_CNF or VCP_DISCOVER_SRVS_CNF.
 */
GA_RESULT VCP_cntrl_setup_vocs_cntx
          (
              /* IN  */ UINT8 vcs_hndl,
              /* OUT */ UINT8 * vocs_hndl
          );

/**
 *  \brief To Setup Audio Input Control Service Context
 *
 *  \par Description:
 *       This function enables to setup a context with given VCS.
 *
 *  \param [in] vcs_hndl
 *        VCS Handle associated with VOCS
 *
 *  \param [out] aics_hndl
 *        Allocated AICS Context Handle.
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 *         If API_SUCCESS, VCP_DISCOVER_SRVS_CONTINUE_CNF or VCP_DISCOVER_SRVS_CNF.
 */
GA_RESULT VCP_cntrl_setup_aics_cntx
          (
              /* IN  */ UINT8  vcs_hndl,
              /* OUT */ UINT8 * aics_hndl
          );

/**
*  \brief To discover given service characteristics.
*
*  \par Description:
*       This function enables to all the charactertics of a given server.
*
*  \param [in] service_type
*        Flag to indicate Service type:
*          0x00 -> VOCS
*          0x01 -> AICS
*
*  \param [in] service_hndl
*        Service Handle Associated with a serive type.
*
*  \return API_SUCCESS or an error code indicating reason for failure
*         If API_SUCCESS, VCP_DISCOVER_CHAR_CNF.
*/
GA_RESULT VCP_cntrl_discover_srvc_composition
          (
              /* IN  */ UINT8  service_type,
              /* IN  */ UINT8  service_hndl
          );

/**
 *  \brief To Configure Volume State for Notifications.
 *
 *  \par Description:
 *       This function enables to configure Volume state for notifications.
 *
 *  \param [in] vcs_hndl
 *        VCS Handle
 *
 *  \param [in] vcs_ntf_flag
 *        Flag to indicate enabled/disable notifications
 *         0x00 -> Disable
 *         0x01 -> Enable
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_cntrl_config_volume_state_notify
          (
              /* IN  */ UINT8  vcs_hndl,
              /* IN  */ UINT8  vcs_ntf_flag
          );

/**
 *  \brief To Get Volume State Value
 *
 *  \par Description:
 *       This function enables to get the Volume State.
 *
 *  \param [in] vcs_hndl
 *        VCS Handle
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_cntrl_get_volume_state
          (
              /* IN  */ UINT8  vcs_hndl
          );

/**
 *  \brief To Configure Volume State Flags for Notifications.
 *
 *  \par Description:
 *       This function enables to configure Volume State Flags for Notifications.
 *
 *  \param [in] vcs_hndl
 *        VCS Handle
 *
 *  \param [in] vcs_ntf_flag
 *        Flag to indicate enabled/disable notifications
 *         0x00 -> Disable
 *         0x01 -> Enable
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_cntrl_config_volume_flags_notify
          (
              /* IN  */ UINT8  vcs_hndl,
              /* IN  */ UINT8  vcs_ntf_flag
          );

/**
 *  \brief To Get Volume Flags
 *
 *  \par Description:
 *       This function enables to get the Volume.
 *
 *  \param [in] vcs_hndl
 *        VCS Handle
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_cntrl_get_volume_flags
          (
              /* IN  */ UINT8  vcs_hndl
          );

/**
 *  \brief  To send VCS Control Point Request.
 *
 *  \par Description:
 *       This routine enables to request VCS control point write.
 *
 *  \param [in] vcs_hndl
 *         VCS Handle
 *
 *  \param [in] cp_op
 *         VCS Control Point Opcode
 *
 *  \param [in] cp_req_data
 *              Control Point Write Request Data
 *
 *  \param [in] valen
 *              Control Point Write Request Data Length.
 *
 *  \return  API_RESULT:
 *           API_SUCCESS on success, or, an Error Code
 *           describing the cause of failure.
 */
GA_RESULT VCP_cntrl_vcs_cp_req
          (
              /* IN  */ UINT8  vcs_hndl,
              /* IN */ UINT8   cp_op,
              /* IN */ void   *cp_req_data,
              /* IN */ UINT16  cp_req_datalen
          );

/**
 *  \brief
 *  To set Relative Volume Down.
 *
 *  \par Description:
 *       This routine enables to set Relative Volume Down.
 *
 *  \param [in] sh
 *         VCS Handle
 *
 *  \param [in] val
 *              Data for Relative Volume Down.
 *
 *  \param [in] len
 *              Data length for Relative Volume Down.
 *
 *  \return  API_RESULT:
 *           API_SUCCESS on success, or, an Error Code
 *           describing the cause of failure.
 */
#define VCP_cntrl_vcs_set_rel_vol_down(sh, val, len)                   \
        VCP_cntrl_vcs_cp_req                                           \
        (                                                              \
             (sh),                                                     \
             (VCS_CP_OP_RELATIVE_VOL_DOWN),                            \
             (val),                                                    \
             (len)                                                     \
        )

/**
 *  \brief
 *  To set Relative Volume Up.
 *
 *  \par Description:
 *       This routine enables to set Relative Volume Up.
 *
 *  \param [in] sh
 *         VCS Handle
 *
 *  \param [in] val
 *              Data for Relative Volume Up.
 *
 *  \param [in] len
 *              Data length for Relative Volume Up.
 *
 *  \return  API_RESULT:
 *           API_SUCCESS on success, or, an Error Code
 *           describing the cause of failure.
 */
#define VCP_cntrl_vcs_set_rel_vol_up(sh, val, len)                     \
        VCP_cntrl_vcs_cp_req                                           \
        (                                                              \
             (sh),                                                     \
             (VCS_CP_OP_RELATIVE_VOL_UP),                              \
             (val),                                                    \
             (len)                                                     \
        )

/**
 *  \brief
 *  To set Unmute & Relative Volume Down.
 *
 *  \par Description:
 *       This routine enables to Unmute & set Relative Volume Down.
 *
 *  \param [in] sh
 *         VCS Handle
 *
 *  \param [in] val
 *              Data for Unmute and Relative Volume Down.
 *
 *  \param [in] len
 *              Data length for Unmute and Relative Volume Down.
 *
 *  \return  API_RESULT:
 *           API_SUCCESS on success, or, an Error Code
 *           describing the cause of failure.
 */
#define VCP_cntrl_vcs_set_unmute_rel_vol_down(sh, val, len)            \
        VCP_cntrl_vcs_cp_req                                           \
        (                                                              \
             (sh),                                                     \
             (VCS_CP_OP_UNMUTE_RELATIVE_VOL_DOWN),                     \
             (val),                                                    \
             (len)                                                     \
        )

/**
 *  \brief
 *  To set Unmute & Relative Volume Up.
 *
 *  \par Description:
 *       This routine enables to set Unmute and Relative Volume Up.
 *
 *  \param [in] sh
 *         VCS Handle
 *
 *  \param [in] val
 *              Data for Unmute & Relative Volume Up.
 *
 *  \param [in] len
 *              Data length for Unmute & Relative Volume Up.
 *
 *  \return  API_RESULT:
 *           API_SUCCESS on success, or, an Error Code
 *           describing the cause of failure.
 */
#define VCP_cntrl_vcs_set_unmute_rel_vol_up(sh, val, len)              \
        VCP_cntrl_vcs_cp_req                                           \
        (                                                              \
             (sh),                                                     \
             (VCS_CP_OP_UNMUTE_RELATIVE_VOL_UP),                       \
             (val),                                                    \
             (len)                                                     \
        )

/**
 *  \brief
 *  To set the Absolute Volume
 *
 *  \par Description:
 *       This routine enables to set the Absolute volume.
 *
 *  \param [in] sh
 *         VCS Handle
 *
 *  \param [in] val
 *              Data for Set Absolute Volume.
 *
 *  \param [in] valen
 *              Data length for Set Absolute Volume.
 *
 *  \return  API_RESULT:
 *           API_SUCCESS on success, or, an Error Code
 *           describing the cause of failure.
 */
#define VCP_cntrl_vcs_set_abs_volume(sh, val, valen)                     \
        VCP_cntrl_vcs_cp_req                                             \
        (                                                                \
             (sh),                                                       \
             (VCS_CP_OP_SET_ABSOLUE_VOL),                                \
             (val),                                                      \
             (valen)                                                     \
        )

/**
 *  \brief
 *  To set Umute
 *
 *  \par Description:
 *       This routine enables to set Unmute.
 *
 *  \param [in] sh
 *              Service Instance Handle.
 *
 *  \param [in] val
 *              Data for Unmute.
 *
 *  \param [in] len
 *              Data length for Unmute.
 *
 *  \return  API_RESULT:
 *           API_SUCCESS on success, or, an Error Code
 *           describing the cause of failure.
 */
#define VCP_cntrl_vcs_set_unmute(sh, val, len)                         \
        VCP_cntrl_vcs_cp_req                                           \
        (                                                              \
             (sh),                                                     \
             (VCS_CP_OP_UNMUTE),                                       \
             (val),                                                    \
             (len)                                                     \
        )

/**
 *  \brief
 *  To set Mute
 *
 *  \par Description:
 *       This routine enables to set Mute.
 *
 *  \param [in] sh
 *              Service Instance Handle.
 *
 *  \param [in] val
 *              Data for Mute.
 *
 *  \param [in] len
 *              Data length for Mute.
 *
 *  \return  API_RESULT:
 *           API_SUCCESS on success, or, an Error Code
 *           describing the cause of failure.
 */
#define VCP_cntrl_vcs_set_mute(sh, val, len)                           \
        VCP_cntrl_vcs_cp_req                                           \
        (                                                              \
             (sh),                                                     \
             (VCS_CP_OP_MUTE),                                         \
             (val),                                                    \
             (len)                                                     \
        )

/* ================= VOCS Related =============== */
/**
 *  \brief To Configure Volume Offset for Notifications.
 *
 *  \par Description:
 *       This function enables to configure Volume Offset for Notification.
 *
 *  \param [in] vocs_hndl
 *        VOCS Handle
 *
 *  \param [in] vocs_vol_offset_ntf_flag
 *        Flag to indicate enabled/disable notifications
 *         0x00 -> Disable
 *         0x01 -> Enable
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_cntrl_vocs_config_volume_offset_notify
          (
              /* IN  */ UINT8  vocs_hndl,
              /* IN  */ UINT8  vocs_vol_offset_ntf_flag
          );

/**
 *  \brief To Get Volume Offset state Value
 *
 *  \par Description:
 *       This function enables to get the Volume Offset state value.
 *
 *  \param [in] vocs_hndl
 *        VOCS Handle
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_cntrl_vocs_get_offset_state
          (
              /* IN  */ UINT8  vocs_hndl
          );

/**
 *  \brief To Configure Audio Location for Notifications.
 *
 *  \par Description:
 *       This function enables to configure Audio Location for Notifications.
 *
 *  \param [in] vocs_hndl
 *        VOCS Handle
 *
 *  \param [in] vocs_vol_audio_loc_ntf_flag
 *        Flag to indicate enabled/disable notification
 *         0x00 -> Disable
 *         0x01 -> Enable
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_cntrl_vocs_config_audio_location_notify
          (
              /* IN  */ UINT8  vocs_hndl,
              /* IN  */ UINT8  vocs_vol_audio_loc_ntf_flag
          );

/**
 *  \brief To Get Audio Location.
 *
 *  \par Description:
 *       This function enables to get Audio Location.
 *
 *  \param [in] vocs_hndl
 *        VOCS Handle
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 *
 * TODO: Revisit the data type of audio location.
 */
GA_RESULT VCP_cntrl_vocs_get_audio_location
          (
              /* IN  */ UINT8  vocs_hndl
          );

/**
 *  \brief To Set Audio Location.
 *
 *  \par Description:
 *       This function enables to set Audio Location.
 *
 *  \param [in] vocs_hndl
 *        VOCS Handle
 *
 *  \param [in] vocs_audio_loc
 *        VOCS Audio Location.
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 *
 * TODO: Revisit the data type of audio location.
 */
GA_RESULT VCP_cntrl_vocs_set_audio_location
          (
              /* IN  */ UINT8  vocs_hndl,
              /* IN */  UINT16 vocs_audio_loc
          );

/**
 *  \brief To Configure Audio Output Description for Notification.
 *
 *  \par Description:
 *       This function enables to configure Audio Output Description for Notification.
 *
 *  \param [in] vocs_hndl
 *        VOCS Handle
 *
 *  \param [in] vocs_audio_out_desc_ntf_flag
 *        Flag to indicate enabled/disable notification
 *         0x00 -> Disable
 *         0x01 -> Enable
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_cntrl_vocs_config_audio_output_desc_notify
          (
              /* IN  */ UINT8  vocs_hndl,
              /* IN  */ UINT8  vocs_audio_out_desc_ntf_flag
          );

/**
 *  \brief To Get Audio Output Description.
 *
 *  \par Description:
 *       This function enables to get Audio Output Description.
 *
 *  \param [in] vocs_hndl
 *        VOCS Handle
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_cntrl_vocs_get_audio_output_description
          (
              /* IN  */ UINT8  vocs_hndl
          );

/**
 *  \brief To Set Audio Output Description.
 *
 *  \par Description:
 *       This function enables to set Audio Output Description.
 *
 *  \param [in] vocs_hndl
 *        VOCS Handle
 *
 *  \param [in] vocs_audio_out_desc
 *        Audio Output Description.
 *
 *  \param [in] vocs_audio_out_desc_len
 *        Audio Output Description Length
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_cntrl_vocs_set_audio_output_description
          (
              /* IN  */ UINT8  vocs_hndl,
              /* IN */  UCHAR  *vocs_audio_out_desc,
              /* IN */  UCHAR  vocs_audio_out_desc_len
          );

/**
 *  \brief  To send VOCS Control Point Request.
 *
 *  \par Description:
 *       This routine enables to request VOCS control point write.
 *
 *  \param [in] vocs_hndl
 *         VOCS Handle
 *
 *  \param [in] cp_op
 *         VOCS Control Point Opcode
 *
 *  \param [in] cp_req_data
 *              Control Point Write Request Data
 *
 *  \param [in] cp_req_datalen
 *              Control Point Write Request Data Length.
 *
 *
 *  \return  API_RESULT:
 *           API_SUCCESS on success, or, an Error Code
 *           describing the cause of failure.
 */
GA_RESULT VCP_cntrl_vocs_cp_req
          (
              /* IN  */ UINT8  vocs_hndl,
              /* IN */ UINT8   cp_op,
              /* IN */ void   *cp_req_data,
              /* IN */ UINT16  cp_req_datalen
          );

/* ================= AICS Related =============== */
/**
 *  \brief To Configure Audio Input state for Notifications.
 *
 *  \par Description:
 *       This function enables to cofigure Audio Input state for Notifications.
 *
 *  \param [in] aics_hndl
 *        AICS Handle
 *
 *  \param [in] aics_input_state_ntf_flag
 *        Flag to indicate enabled/disable notifications
 *         0x00 -> Disable
 *         0x01 -> Enable
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_cntrl_aics_config_input_state_notify
          (
              /* IN  */ UINT8  aics_hndl,
              /* IN  */ UINT8  aics_input_state_ntf_flag
          );

/**
 *  \brief To Get Input State.
 *
 *  \par Description:
 *       This function enables to get Input state.
 *
 *  \param [in] aics_hndl
 *        AICS Handle
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_cntrl_aics_get_input_state
          (
              /* IN  */ UINT8  aics_hndl
          );

/**
 *  \brief To Get Gain Setting Properties.
 *
 *  \par Description:
 *       This function enables to get Gain Setting Properties.
 *
 *  \param [in] aics_hndl
 *        AICS Handle
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_cntrl_aics_get_gain_setting_properites
          (
              /* IN  */ UINT8  aics_hndl
          );

/**
 *  \brief To Get Input Type.
 *
 *  \par Description:
 *       This function enables to Input Type.
 *
 *  \param [in] aics_hndl
 *        AICS Handle
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_cntrl_aics_get_input_type
          (
              /* IN  */ UINT8  aics_hndl
          );

/**
 *  \brief To Configure Volume State for Notifications.
 *
 *  \par Description:
 *       This function enables to Shutdown the GA VCP Module;
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_cntrl_aics_config_input_status_notify
          (
              /* IN  */ UINT8  aics_hndl,
              /* IN  */ UINT8  aics_input_status_ntf_flag
          );

/**
 *  \brief To Get Volume State Value
 *
 *  \par Description:
 *       This function enables to Shutdown the GA VCP Module;
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_cntrl_aics_get_input_status
          (
              /* IN  */ UINT8  aics_hndl
          );

/**
 *  \brief To Configure Audio Input Description for notification.
 *
 *  \par Description:
 *       This function enables to configure Audio Input Description for notification.
 *
 *  \param [in] aics_hndl
 *        AICS Handle
 *
 *  \param [in] aics_input_state_ntf_flag
 *        Flag to indicate enabled/disable notifications
 *         0x00 -> Disable
 *         0x01 -> Enable
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_cntrl_aics_config_audio_input_desc_notify
          (
              /* IN  */ UINT8  aics_hndl,
              /* IN  */ UINT8  aics_audio_input_desc_ntf_flag
          );

/**
 *  \brief To Get Audio Input Description.
 *
 *  \par Description:
 *       This function enables to get Audio Input Description.
 *
 *  \param [in] aics_hndl
 *        AICS Handle
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_cntrl_aics_get_audio_input_desc
          (
              /* IN  */ UINT8  aics_hndl
          );

/**
 *  \brief To Set Audio Input Description.
 *
 *  \par Description:
 *       This function enables to Set Audio Input Description.
 *
 *  \param [in] aics_hndl
 *        AICS Handle
 *
 *  \param [in] aics_audio_in_desc
 *        Audio Input Description.
 *
 *  \param [in] aics_audio_in_desc_len
 *        Audio Input Description Length.
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_cntrl_aics_set_audio_input_description
          (
              /* IN  */ UINT8   aics_hndl,
              /* IN */  UCHAR  *aics_audio_in_desc,
              /* IN */  UCHAR   aics_audio_in_desc_len
          );

/**
 *  \brief  To send AICS Control Point Request.
 *
 *  \par Description:
 *       This routine enables to request VOCS control point write.
 *
 *  \param [in] aics_hndl
 *         AICS Handle
 *
 *  \param [in] cp_op
 *         AICS Control Point Opcode
 *
 *  \param [in] cp_req_data
 *              Control Point Write Request Data
 *
 *  \param [in] cp_req_datalen
 *              Control Point Write Request Data Length.
 *
 * *  \return  API_RESULT:
 *           API_SUCCESS on success, or, an Error Code
 *           describing the cause of failure.
 */
GA_RESULT VCP_cntrl_aics_cp_req
          (
              /* IN  */ UINT8  aics_hndl,
              /* IN */ UINT8   aics_op,
              /* IN */ void   *cp_req_data,
              /* IN */ UINT16  cp_req_datalen
          );

/**
 *  \brief
 *  To set the Gain Setting.
 *
 *  \par Description:
 *       This routine enables to set Gain Setting.
 *
 *  \param [in] sh
 *         AICS Handle
 *
 *  \param [in] val
 *              Data for Gain Setting.
 *
 *  \param [in] valen
 *              Data length for Gain Setting.
 *
 *  \return  API_RESULT:
 *           API_SUCCESS on success, or, an Error Code
 *           describing the cause of failure.
 */
#define VCP_ctrl_aics_cp_set_gain_setting(sh, val, valen)                \
        VCP_cntrl_aics_cp_req                                            \
        (                                                                \
             (sh),                                                       \
             (AICS_CP_OP_SET_GAIN_SETTING),                              \
             (val),                                                      \
             (valen)                                                     \
        )

/**
 *  \brief
 *  To set the Unmute
 *
 *  \par Description:
 *       This routine enables to set Unmute.
 *
 *  \param [in] sh
 *         AICS Handle
 *
 *  \param [in] val
 *              Data to set Unmute.
 *
 *  \param [in] valen
 *              Data length to Set Unmute.
 *
 *  \return  API_RESULT:
 *           API_SUCCESS on success, or, an Error Code
 *           describing the cause of failure.
 */
#define VCP_ctrl_aics_cp_set_unmute(sh, val, valen)                      \
        VCP_cntrl_aics_cp_req                                            \
        (                                                                \
             (sh),                                                       \
             (AICS_CP_OP_UNMUTE),                                        \
             (val),                                                      \
             (valen)                                                     \
        )

 /**
 *  \brief
 *  To set the Mute
 *
 *  \par Description:
 *       This routine enables to set Mute.
 *
 *  \param [in] sh
 *         AICS Handle
 *
 *  \param [in] val
 *              Data to set Mute.
 *
 *  \param [in] valen
 *              Data length to Set Mute.
 *
 *  \return  API_RESULT:
 *           API_SUCCESS on success, or, an Error Code
 *           describing the cause of failure.
 */
#define VCP_ctrl_aics_cp_set_mute(sh, val, valen)                        \
        VCP_cntrl_aics_cp_req                                            \
        (                                                                \
             (sh),                  ]                                     \
             (AICS_CP_OP_MUTE),                                          \
             (val),                                                      \
             (valen)                                                     \
        )

/**
 *  \brief
 *  To set Manual Gain Mode.
 *
 *  \par Description:
 *       This routine enables to set Manual Gain Mode.
 *
 *  \param [in] sh
 *         AICS Handle
 *
 *  \param [in] val
 *              Data to set Manual Gain Mode.
 *
 *  \param [in] valen
 *              Data length to Set Manual Gain Mode.
 *
 *  \return  API_RESULT:
 *           API_SUCCESS on success, or, an Error Code
 *           describing the cause of failure.
 */
#define VCP_ctrl_aics_cp_set_manual_gain_mode(sh, val, valen)            \
        VCP_cntrl_aics_cp_req                                            \
        (                                                                \
             (sh),                                                       \
             (AICS_CP_OP_SET_MANUAL_GAIN_MODE),                          \
             (val),                                                      \
             (valen)                                                     \
        )

 /**
 *  \brief
 *  To set Auto Gain Mode.
 *
 *  \par Description:
 *       This routine enables to set Auto Gain Mode.
 *
 *  \param [in] sh
 *         AICS Handle
 *
 *  \param [in] val
 *              Data to set Auto Gain Mode.
 *
 *  \param [in] valen
 *              Data length to Set Auto Gain Mode.
 *
 *  \return  API_RESULT:
 *           API_SUCCESS on success, or, an Error Code
 *           describing the cause of failure.
 */
#define VCP_ctrl_aics_cp_set_auto_gain_mode(sh, val, valen)              \
        VCP_cntrl_aics_cp_req                                            \
        (                                                                \
             (sh),                                                       \
             (AICS_CP_OP_SET_AUTO_GAIN_MODE),                            \
             (val),                                                      \
             (valen)                                                     \
        )

#endif /* GA_VCP_CONTROLLER */

/* ============= VCP Renderer ============= */
#ifdef GA_VCP_RENDERER
/**
 *  \brief To Setup VCP VCS Context
 *
 *  \par Description:
 *       This function enables to Shutdown the GA VCP Module;
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_rndr_setup_vcs_cntx(void);

/**
 *  \brief To Setup VCP VOCS Context
 *
 *  \par Description:
 *       This function enables to Shutdown the GA VCP Module;
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_rndr_setup_vocs_cntx
          (
              /* OUT */ UINT8 * vocs_hndl
          );

/**
 *  \brief To Setup VCP VOCS Context
 *
 *  \par Description:
 *       This function enables to Shutdown the GA VCP Module;
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_rndr_setup_aics_cntx
          (
              /* OUT */ UINT8 * vocs_hndl
          );

/**
 *  \brief To Set Volume State Information.
 *
 *  \par Description:
 *       This function enables to Shutdown the GA VCP Module;
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_rndr_vcs_set_volume_state_info
          (
              /* IN */ VCS_CHAR_VOL_STATE_PARAMS *vcs_vs_info
          );

/**
 *  \brief To Set Volume Flag Information.
 *
 *  \par Description:
 *       This function enables to Shutdown the GA VCP Module;
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_rndr_vcs_set_volume_flag_info
           (
               /* IN */ UCHAR vcs_volume_flag
           );

/**
 *  \brief To Set Volume offset Information.
 *
 *  \par Description:
 *       This function enables to Shutdown the GA VCP Module;
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_rndr_vocs_set_offset_info
           (
               /* IN  */ UINT8  vocs_hndl,
               /* IN */ VOCS_CHAR_OFFSET_STATE_PARAMS *vocs_offset_info
           );

/**
 *  \brief To Set Audio Location Information.
 *
 *  \par Description:
 *       This function enables to Shutdown the GA VCP Module;
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_rndr_vocs_set_audio_location_info
           (
               /* IN  */ UINT8  vocs_hndl,
               /* IN  */ UINT16 audio_location
           );

/**
 *  \brief To Set Audio Output Description.
 *
 *  \par Description:
 *       This function enables to Shutdown the GA VCP Module;
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_rndr_vocs_set_audio_output_info
           (
               /* IN  */ UINT8  vocs_hndl,
               /* IN */ UCHAR  *audio_desc,
               /* IN */ UCHAR   audio_desc_len
           );

/**
 *  \brief To Set Input State.
 *
 *  \par Description:
 *       This function enables to Shutdown the GA VCP Module;
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_rndr_aics_set_input_state_info
          (
              /* IN  */ UINT8  aics_hndl,
              /* IN */ AICS_CHAR_INPUT_STATE_PARAMS *aics_input_state_info
          );

/**
 *  \brief To Set Gain Setting Info.
 *
 *  \par Description:
 *       This function enables to Shutdown the GA VCP Module;
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_rndr_aics_set_gain_setting_info
          (
              /* IN  */ UINT8  aics_hndl,
              /* IN */ AICS_CHAR_GAIN_SETTING_PARAMS *aics_gain_setting_info
          );

/**
 *  \brief To Set Input Type.
 *
 *  \par Description:
 *       This function enables to Shutdown the GA VCP Module;
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 *
 * TODO: Check: input_type data type.
 */
GA_RESULT VCP_rndr_aics_set_input_type
          (
              /* IN  */ UINT8  aics_hndl,
              /* IN */  UCHAR  input_type
          );

/**
 *  \brief To Set Input status.
 *
 *  \par Description:
 *       This function enables to Shutdown the GA VCP Module;
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_rndr_aics_set_input_status
          (
              /* IN  */ UINT8  aics_hndl,
              /* IN */  UCHAR  input_status
          );

/**
 *  \brief To Set Audio Input Description.
 *
 *  \par Description:
 *       This function enables to Shutdown the GA VCP Module;
 *
 *  \return API_SUCCESS or an error code indicating reason for failure
 */
GA_RESULT VCP_rndr_aics_set_audio_input_desc_info
           (
               /* IN  */ UINT8  aics_hndl,
               /* IN */ UCHAR  *audio_desc,
               /* IN */ UCHAR   audio_desc_len
           );

#endif /* GA_VCP_RENDERER */

#if 0
vcp_configure_volume_state_notification(enable);
vcp_read_volume_state();
vcp_configure_volume_flags_notification(enable);
vcp_read_volume_flags();
vcp_set_initial_volume();

vcp_cp_relative_volume_down();
vcp_cp_relative_volume_up();
vcp_cp_unmute_relative_volume_down();
vcp_cp_unmute_relative_volume_up();
vcp_cp_unmute();
vcp_cp_mute();

vocp_configure_offset_state_notification(enable);
vocp_read_offset_state();
vocp_configure_audio_location_notification(enable);
vocp_read_audio_location();
vocp_set_audio_location();
vocp_configure_audio_output_description_notification(enable);
vocp_read_audio_output_description();
vocp_set_audio_output_description();

vocp_cp_set_volume_offset();

aicp_configure_input_state_notification(enable);
aicp_read_input_state();
aicp_read_gain_setting_properties();
aicp_read_input_type();
aicp_configure_input_status_notification(enable);
aicp_read_input_status();
aicp_configure_audio_input_description_notification(enable);
aicp_read_audio_input_description();
aicp_set_audio_input_description();

aicp_cp_set_gain_setting();
aicp_cp_unmute();
aicp_cp_mute();
aicp_cp_set_manual_gain_mode();
aicp_cp_set_automatic_gain_mode();
#endif /* 0 */

#endif /* _H_VCP_ */



